有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Struts会话表单bean不保留状态

我正在使用Struts 1.3创建一个类似向导的界面,由3个jsp页面和3个Struts操作组成。流程如下所示: 第1页>;行动1->;第2页>;行动2->;第3页>;行动3

我使用会话表单bean(具有会话作用域的操作表单)在请求之间共享数据。我遇到的问题是,我在第2页中提交的数据在操作2中可用,但在操作3中不可用。我怀疑这可能是因为我在第3页没有一个表单来保存这些数据,或者因为我通过jQuery post方法调用action3而不是常规表单提交,但我真的不确定

我已经在网上挖了差不多一天了,但还是没有运气。谁能帮点忙吗。非常感谢


共 (4) 个答案

  1. # 1 楼答案

    您如何在action2和action3中访问page2的表单bean
    我想你走错路了。你是不是有关于invalidCast之类的例外

  2. # 2 楼答案

    每次请求都会调用表单上的reset()方法,因此您将丢失状态。您可以通过编程方式控制此操作

    public class MyForm extends ActionForm {
        boolean reset = true;
        private String[] checkboxes = {};
    
        @Override
        public void reset(ActionMapping mapping, HttpServletRequest request) {
            if (reset) {
                this.checkboxes = new String[];
                // etc
            }
    
            reset = true;
        }
    
        public void doNotReset() {
            reset = false;
        }
    }
    

    让action2在表单上调用doNotReset()

  3. # 3 楼答案

    谢谢你的投入。下面是我解决问题的方法。我真的不喜欢这个解决方案,但它可能是我能找到的最整洁的解决方案

    在第3页中,我为希望在操作3中可用的任何属性添加了隐藏字段。Struts将把值存储在这些隐藏字段中,当表单再次提交时,数据将重新填充到动作表单中

    在我看来,Struts的工作原理是这样的:当它加载第3页时,它试图用myForm的值填充第3页中的表单。当表单被提交时,该过程被反转,它用来自用户表单的值填充myForm。问题是,在用用户提交的值填充myForm之前,它会重置myForm的属性。因为重置后,它找不到这些字段的值,所以它将其保留为空

    我认为Struts那样工作没有意义,但是。。。就这样吧

  4. # 4 楼答案

    我想您可能已经为strutconfig中的两个操作分配了相同的表单。xml,因此它没有给出ClassCastException。顺便说一下,如果您想访问操作2中填充的表单bean,请执行以下操作

    1. 查看strutconfig文件,查看两个动作(2和3)的动作映射。为单独的操作保留不同的表单名称(例如,操作2的表单2和操作3的表单3)
    2. 在Action3中,不要强制转换表单,而是使用以下form2 = (FormBean2) session.getAttribute("form2");

    上面的原因是因为两个操作使用相同的表单,struts可能会覆盖它。希望上面能解决你的问题